package com.moyoutian.cscn;

/**
 * 问题描述：
 * 一个字符串是否包含另一个字符串的字母乱序
 * <p>
 * 举例：abcdefgfg 包含 fgfg ,ffgg ,ggff 等 不包含 dfgfg
 */
public class StringContent {


    public static void main(String[] args) {
        System.out.println(compere("fsfsa", "fsa"));
    }

    /**
     * @param b 被判断是否包含另一字符串的串
     * @param w 是否被包含的字符穿
     * @return 是否被包含结果
     */
    private static boolean compere(String b, String w) {
        if (b == null || w == null || b.length() < w.length()) {
            return false;
        }

        int[] ws = new int[256];

        char[] wc = w.toCharArray();
        // 负债因子，一个单词计数一次
        // 每有一个不为0的单词就统计一次，如果这个为0证明匹配成功
        int count = 0;
        // 初始化负债表
        for (int i = 0; i < wc.length; i++) {
            if (++ws[wc[i]] == 1) {
                count++;
            }
        }
        char[] bc = b.toCharArray();
        // 左边界
        int l = 0;
        for (int i = 0; i < bc.length; i++) {
            // 滑进来
            if (--ws[bc[i]] == 0) {
                count--;
            }
            // 滑出去
            if (i - l == wc.length) {
                // 滑出去之前如果为0.证明滑出去之后不为零，所以统计count+1
                if (ws[bc[l]]++ == 0) {
                    count++;
                }
                l++;
            }
            if (count == 0) {
                return true;
            }
        }
        return false;
    }

    /**
     * @param chars 滑道上的数据
     * @param s     当前的数据
     * @return 是否当前滑到正好满
     */
    private static boolean slide(char[] chars, char s) {
        // 如果当前插入的数据等于头结点
        return false;
    }

    /**
     * @param ints 滑道上的数据
     * @param s    当前的数据
     * @return 是否当前滑到正好满
     */
    private static boolean slide(int[] ints, char s) {
        // 如果当前插入的数据等于头结点
        return false;
    }
}
